package d0515_Lang包;

public class Object类 {

	public static void main(String[] args) {
		A a = new A();
		a.name = "张三";
		a.age = 18;

		/**
		 * String toString()	返回当前对象的字符串表示，如果有必要，
		 * 应该在自定义的类中覆盖该方法
		 */
		// Object 默认的toString方法输出: 包名+类名+内存地址16进制编码
		// d0515_Lang包.A@2a139a55
		System.out.println(a.toString());
		System.out.println(a); // 如果对象和字符串拼接, 那么自动调用toString方法

		/**
		 * boolean equals(Object obj)	判断当前对象是否与参数obj（内容）相等，
		 * 如果有必要，应该在自定义的类中覆盖该方法
		 */

		A a1 = new A();
		a1.name = "张三";
		a1.age = 18;
		
		A a2 = a;
		// == 用于比较对象: 引用比较, 对比两个变量引用的地址
		System.out.println(a1 == a);  // false
		System.out.println(a2 == a);
		
		System.out.println(a1.equals(a)); // true  ctrl + 鼠标点击方法 查看源码
		System.out.println(a2.equals(a));

		/**
		 * a.hashCode() // 返回 哈希吗   于集合有关系
		 */
		
		System.out.println(a.hashCode());
		
	}

}

class A {

	String name;
	int age;

	public String toString() {
		return "姓名:" + name + "  年龄:" + age;
	}

	/**
	 * 必须重新 equals 函数才能比较对象的内容   , 默认是 == 比较
	 */
	public boolean equals(Object a) {
		// 比较的对象的类必须和我相同
		if (a.getClass() == this.getClass()) {
			A a1 = (A) a; // 强转
			if (this.name.equals(a1.name) && this.age == a1.age) {
				return true;
			}
		}
		return false;
	}

}